﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Fotoalbum.BLL
{
    public class LogikAdapter : ILogikAdapter
    {
        private const bool _CacheAktiviert = false;

        DAL.IDataAdapter _dataAdapter = DAL.DataAdapter.CreateInstance();

        #region Cache

        private bool _bilderKomplett = false;
        private Dictionary<Guid, Bild> _bilder = new Dictionary<Guid, Bild>();
        public Dictionary<Guid, Bild> Bilder
        {
            get { return _bilder; }
            set { _bilder = value; }
        }

        private bool _albenKomplett = false;
        private Dictionary<Guid, Core.AlbumData> _alben = new Dictionary<Guid, Fotoalbum.Core.AlbumData>();
        public Dictionary<Guid, Core.AlbumData> Alben
        {
            get { return _alben; }
            set { _alben = value; }
        }

        private bool _markierungenKomplett = false;
        private Dictionary<Guid, Core.BildMarkierungData> _markierungen = new Dictionary<Guid, Fotoalbum.Core.BildMarkierungData>();
        public Dictionary<Guid, Core.BildMarkierungData> Markierungen
        {
            get { return _markierungen; }
            set { _markierungen = value; }
        }

        #endregion Cache

        #region Singelton

        private static LogikAdapter _instance;
        private LogikAdapter() 
        { 
        }

        public static LogikAdapter CreateInstance()
        {
            if (_instance == null)
                _instance = new LogikAdapter();

            return _instance;
        }

        #endregion Singelton

        private bool BildDateiVorhanden(string pfad)
        {
            if (BildAuslesen(pfad) != null)
                return false;

            return true;
        }

        private Bild BildAuslesen(string pfad)
        {
            Core.BildData bildData = _dataAdapter.BildAuslesen(pfad);

            if (bildData != null)
            {
                Bild bild = new Bild(bildData);
                if (_CacheAktiviert)
                    _bilder.Add(bild.BildID, bild);
                return bild;
            }

            return null;
        }

        #region ILogikAdapter Members

        public Bild BildErstellen(string pfad)
        {
            if (BildDateiVorhanden(pfad))
                return null;
            //TODO plausi BildErstellen()

            Core.BildData bildData = new Core.BildData(pfad);
            if (_dataAdapter.BildHinzufügen(bildData))
            {
                Bild bild = new Bild(bildData);
                if (_CacheAktiviert)
                    _bilder.Add(bildData.BildID, bild);
            }
            return new Bild(bildData);
        }

        public Bild BildAuslesen(Guid bildID)
        {
            if (_CacheAktiviert)
                if (_bilder.ContainsKey(bildID))
                    return _bilder[bildID];

            Core.BildData bildData = _dataAdapter.BildAuslesen(bildID);

            if (bildData != null)
            {
                Bild bild = new Bild(bildData);
                if (_CacheAktiviert)
                    _bilder.Add(bild.BildID, bild);
                return bild;
            }

            return null;
        }

        public List<Bild> AlleBilderAuslesen()
        {
            if (_CacheAktiviert)
                if (_bilderKomplett)
                    return _bilder.Values.ToList<Bild>();

            List<Bild> bilder = new List<Bild>();
            List<Core.BildData> bildDatas = _dataAdapter.AlleBilderAuslesen();

            foreach (Core.BildData bildData in bildDatas)
            {
                Bild bild = new Bild(bildData);
                bilder.Add(bild);
                if (_CacheAktiviert)
                    _bilder.Add(bild.BildID, bild);
            }
            _bilderKomplett = true;
            return bilder;
        }

        public List<Core.AlbumData> AlleAlbenAuslesen()
        {
            if (_CacheAktiviert)
                if (_albenKomplett)
                    return _alben.Values.ToList<Core.AlbumData>();

            List<Core.AlbumData> alben = _dataAdapter.AlleAlbenAuslesen();

            if (_CacheAktiviert)
            {
                foreach (Core.AlbumData album in alben)
                {
                    _alben.Add(album.AlbumID, album);
                }
                _albenKomplett = true;
            }
            return alben;
        }

        public List<Bild> BilderAuslesen(BildFilter filter)
        {
            List<Bild> bilderListe = new List<Bild>();
            foreach (Core.BildData bildData in _dataAdapter.BilderAuslesen(filter.ToSqlWhereClause()))
            {
                bilderListe.Add(new Bild(bildData));
            }
            return bilderListe;
        }

        #endregion
    }
}
